home *** CD-ROM | disk | FTP | other *** search
/ Freelog Special Edition 10 / FreelogHS10.iso / Buzz / Buzz_Advanced_Pack.exe / {app} / Dev / Overloader - Au Recorder / nextsunrec.cpp < prev    next >
C/C++ Source or Header  |  2001-10-26  |  9KB  |  324 lines

  1. #include <stdio.h>
  2. #include <assert.h>
  3. #include <string.h>
  4. #include <windows.h>
  5. #include "resource.h"
  6.   
  7. double const PI = 3.14159265358979323846;
  8.  
  9. HINSTANCE dllInstance;
  10.  
  11. #define MAX_BUFFER_LENGTH        256            // in number of samples
  12.  
  13. class COOERecorder {
  14. public:
  15.     virtual bool __cdecl Init();
  16.  
  17.     virtual bool __cdecl IsMultiTrack();
  18.     virtual bool __cdecl IsTagged();
  19.     virtual bool __cdecl IsStreamed();
  20.     virtual bool __cdecl IsRequiresWaveout();
  21.     virtual bool __cdecl IsLossyCompression();
  22.  
  23.     virtual bool __cdecl IsSampleRateChangeable();
  24.     virtual bool __cdecl SampleRateChanged(int samplerate);
  25.     virtual bool __cdecl IsBitRateChangeable();
  26.     virtual bool __cdecl BitRateChanged(int bitrate);
  27.  
  28.     virtual bool __cdecl SupportsSampleRate(int samplerate);
  29.     virtual bool __cdecl SupportsBitRate(int bitrate);
  30.  
  31.     virtual bool __cdecl SaveAs(HWND parentwindow);
  32.     virtual bool __cdecl ReadyToRec();
  33.  
  34.     virtual bool __cdecl TrackNames(int track_id, char *track_name);
  35.     virtual bool __cdecl SongTagData(int tag_index, char *tagdata);
  36.  
  37.     virtual bool __cdecl Start(char * filename, int samplespersec);
  38.     virtual bool __cdecl WorkOutput(float *psamples, int numsamples);
  39.     virtual bool __cdecl WorkOutputMulti(int track_id, float *psamples, int numsamples);
  40.  
  41.     virtual bool __cdecl Finish();
  42.     virtual void __cdecl ConfigDlg(HWND parentwindow);
  43.     virtual void __cdecl DispatchCommand(int command_id, int param1, int param2, int param3, int param4);
  44.     virtual void __cdecl DispatchCommandEx(char * str_command, char * str_value);
  45.  
  46.     virtual void __cdecl LoadSettings(char * settingsname, char *username, char *domain);
  47.     virtual void __cdecl SaveSettings(char * settingsname, char *username, char *domain);
  48.  
  49.     virtual char * __cdecl OutputFilename();
  50.     virtual char * __cdecl OutputSize();
  51.     virtual char * __cdecl ExtraInfo(int extra_info_id);
  52.     virtual char * __cdecl RecordersWebSiteURL();
  53.  
  54.     virtual int __cdecl RecorderVersion();
  55.  
  56.     virtual void GetRecorderExtensionsClass(int param, void **exmodule);
  57. };
  58.  
  59. class rec : public COOERecorder {
  60. public:
  61.     virtual bool __cdecl Init();
  62.  
  63.     virtual bool __cdecl IsMultiTrack() { return false; };
  64.     virtual bool __cdecl IsTagged() { return true; };
  65.     virtual bool __cdecl IsStreamed() { return false; };
  66.     virtual bool __cdecl IsRequiresWaveout() { return false; };
  67.     virtual bool __cdecl IsLossyCompression() { return false; };
  68.  
  69.     virtual bool __cdecl IsSampleRateChangeable() { return false; };
  70.     virtual bool __cdecl SampleRateChanged(int samplerate) { return false; };
  71.     virtual bool __cdecl IsBitRateChangeable() { return false; };
  72.     virtual bool __cdecl BitRateChanged(int bitrate) { return false; };
  73.  
  74.     virtual bool __cdecl SupportsSampleRate(int samplerate) { return true; };
  75.     virtual bool __cdecl SupportsBitRate(int bitrate) { return true; };
  76.  
  77.     virtual bool __cdecl SaveAs(HWND parentwindow);
  78.     virtual bool __cdecl ReadyToRec();
  79.  
  80.     virtual bool __cdecl TrackNames(int track_id, char *track_name) { return false; };
  81.     virtual bool __cdecl SongTagData(int tag_index, char *tagdata);
  82.  
  83.     virtual bool __cdecl Start(char * filename, int samplespersec);
  84.     virtual bool __cdecl WorkOutput(float *psamples, int numsamples);
  85.     virtual bool __cdecl WorkOutputMulti(int track_id, float *psamples, int numsamples) { return false; };
  86.  
  87.     virtual bool __cdecl Finish();
  88.     virtual void __cdecl ConfigDlg(HWND parentwindow);
  89.     virtual void __cdecl DispatchCommand(int command_id, int param1, int param2, int param3, int param4) { };
  90.     virtual void __cdecl DispatchCommandEx(char * str_command, char * str_value) { };
  91.  
  92.     virtual void __cdecl LoadSettings(char * settingsname, char *username, char *domain) { };
  93.     virtual void __cdecl SaveSettings(char * settingsname, char *username, char *domain) { };
  94.  
  95.     virtual char * __cdecl OutputFilename();
  96.     virtual char * __cdecl OutputSize();
  97.     virtual char * __cdecl ExtraInfo(int extra_info_id) { return "No Extra Info"; };
  98.     virtual char * __cdecl RecordersWebSiteURL() { return "http://www.buzzscene.ca/"; };
  99.  
  100.     virtual int __cdecl RecorderVersion() { return 100; };
  101.  
  102.     virtual void GetRecorderExtensionsClass(int param, void **exmodule) { };
  103. public:
  104.     char myfilename[255];
  105.     FILE * myfilehandle;
  106.     char songtitle[100];
  107.     char songartist[100];
  108.     int writtensofar;
  109.     int bitdepth;
  110. };
  111.  
  112. bool rec::Init(){
  113.     sprintf(myfilename, "");
  114.     myfilehandle = NULL;
  115.     writtensofar = 0;
  116.     bitdepth = 0;
  117.     sprintf(songtitle, "");
  118.     sprintf(songartist, "");
  119.     return true;
  120. }
  121. bool rec::SaveAs(HWND parentwindow){
  122.     OPENFILENAME ofl;
  123.     char filename[255];
  124.     int nSuccess;
  125.  
  126.     sprintf(filename,"untitled.au");
  127.     ofl.lStructSize = sizeof(ofl);
  128.     ofl.hwndOwner = parentwindow;
  129.     ofl.hInstance = dllInstance;
  130.     ofl.lpstrFilter = "Next\\Sun sound format (*.au)\0*.au\0";
  131.     ofl.lpstrCustomFilter = NULL;
  132.     ofl.nMaxCustFilter = NULL;
  133.     ofl.nFilterIndex = 1;
  134.     ofl.lpstrFile = filename;
  135.     ofl.nMaxFile = 255;
  136.     ofl.lpstrFileTitle = NULL;
  137.     ofl.nMaxFileTitle = NULL;
  138.     ofl.lpstrInitialDir = NULL;
  139.     ofl.lpstrTitle = "Save Song Output as";
  140.     ofl.Flags = OFN_OVERWRITEPROMPT|OFN_PATHMUSTEXIST;
  141.     ofl.nFileOffset = 0;
  142.     ofl.nFileExtension = 0;
  143.     ofl.lpstrDefExt = ".au";
  144.     ofl.lCustData = NULL;
  145.     ofl.lpfnHook = NULL;
  146.     ofl.lpTemplateName = NULL;
  147.     nSuccess = GetSaveFileName(&ofl);
  148.     if (nSuccess == 0) {
  149.         sprintf(myfilename, "");
  150.     } else {
  151.         sprintf(myfilename, ofl.lpstrFile);
  152.     }
  153.     return true;
  154. }
  155. char *rec::OutputFilename() {
  156.     return myfilename;
  157. }
  158.  
  159. bool rec::SongTagData(int tag_index, char *tagdata) {
  160.     switch (tag_index) {
  161.     case 0: sprintf(songtitle, tagdata); return true; 
  162.     case 1: sprintf(songartist, tagdata); return true;
  163.     case 2: return false;
  164.     default:
  165.         return false;
  166.     }
  167. }
  168.  
  169. bool rec::Start (char * filename, int samplespersec) {
  170.     char addinfo[204];
  171.     short data1 = 0x0000;
  172.     char data1a = 0x00;
  173.     char data1b = 0x00; // custom
  174.     long data2 = 0xFFFFFFFF;
  175.     long data3 = 0x03000000;
  176.     long data4 = 0x44AC0000;
  177.     long data5 = 0x02000000;
  178.     long datablk=0x00000000;
  179.     int i;
  180.  
  181.     myfilehandle = fopen(filename, "wb");
  182.     writtensofar = 0;
  183.  
  184.     if (strlen(songartist) == 0) {
  185.         if (strlen(songtitle) == 0) {
  186.             sprintf(addinfo, "");
  187.         } else {
  188.             sprintf(addinfo, "%s", songtitle);
  189.         }
  190.     } else {
  191.         if (strlen(songtitle) == 0) {
  192.             sprintf(addinfo, "%s", songartist);
  193.         } else {
  194.             sprintf(addinfo, "%s - %s", songartist, songtitle);
  195.         }
  196.     }
  197.     
  198.     fwrite(".snd", 1, 4,myfilehandle);
  199.     
  200.     data1b = 24 + strlen(addinfo)+1;
  201.     fwrite(&data1, sizeof(short), 1, myfilehandle);
  202.     fwrite(&data1a, sizeof(char), 1, myfilehandle);
  203.     fwrite(&data1b, sizeof(char), 1, myfilehandle);
  204.  
  205.     fwrite(&data2, sizeof(long), 1,myfilehandle);
  206.     fwrite(&data3, sizeof(long), 1,myfilehandle);
  207.     fwrite(&data4, sizeof(long), 1,myfilehandle);
  208.     fwrite(&data5, sizeof(long), 1,myfilehandle);
  209.  
  210.     fwrite(addinfo, sizeof(char), strlen(addinfo)+1, myfilehandle);
  211.  
  212.     return true;
  213. }
  214. bool rec::ReadyToRec() {
  215.     if (strcmp(myfilename, "") == 0) {
  216.         return false;
  217.     } else {
  218.         return true;
  219.     }
  220.  
  221. }
  222.  
  223. static union {
  224.     short thepsamp;
  225.     char  thepsampbytes[2];
  226. };
  227.  
  228. bool rec::WorkOutput (float *psamples, int numsamples) {
  229.     short psampsm[1024];
  230.     char bufpsampbyte;
  231.     for (int i = 0; i < (numsamples * 2); i++) {
  232.         if (psamples[i] > 32767.0f) psamples[i] = 32767.0f;
  233.         if (psamples[i] < -32766.0f) psamples[i] = -32766.0f;
  234.         psampsm[i] = (short)psamples[i];
  235.         thepsamp = psampsm[i];
  236.         bufpsampbyte = thepsampbytes[0];
  237.         thepsampbytes[0] = thepsampbytes[1];
  238.         thepsampbytes[1] = bufpsampbyte;
  239.         psampsm[i] = thepsamp;
  240.     }
  241.     writtensofar += numsamples;
  242.     fwrite(psampsm, sizeof(short), numsamples * 2,myfilehandle);
  243.     return true;
  244. }
  245.  
  246. bool rec::Finish() {
  247.     fflush(myfilehandle);
  248.     fclose(myfilehandle);
  249.     return true;
  250. }
  251.  
  252. char * rec::OutputSize() {
  253.     static char megs[32];
  254.     if (bitdepth == 1) {
  255.         sprintf(megs, "%.2fM", ((float)writtensofar * 4.0f / 1024.0f / 1024.0f));
  256.     } else {
  257.         sprintf(megs, "%.2fM", ((float)writtensofar * 2.0f * (float)sizeof(float) / 1024.0f / 1024.0f));
  258.     }
  259.     return megs;
  260. }
  261.  
  262. rec *prec;
  263.  
  264. BOOL APIENTRY ConfigDialog (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  265.     switch(uMsg) {
  266.     case WM_INITDIALOG:
  267.     {
  268. //        if (prec->bitdepth == 1) {
  269. //            CheckDlgButton(hDlg,IDC_RADIO16,1);
  270. //        } else {
  271. //            CheckDlgButton(hDlg,IDC_RADIO32,1);
  272. //        }
  273.         return 1;
  274.     }
  275.     case WM_SHOWWINDOW:
  276.     {
  277.         return 1;
  278.     }
  279.     case WM_CLOSE:
  280.     {
  281.         EndDialog (hDlg, TRUE);
  282.     }
  283.     case WM_COMMAND:
  284.         switch ( LOWORD (wParam))
  285.         {
  286.         case IDOK:
  287.             
  288. //            if (IsDlgButtonChecked(hDlg, IDC_RADIO32) == 1) { prec->bitdepth = 0; }
  289. //            if (IsDlgButtonChecked(hDlg, IDC_RADIO16) == 1) { prec->bitdepth = 1; }
  290.  
  291.             EndDialog (hDlg, TRUE);
  292.             break;
  293.         case IDCANCEL:
  294.             EndDialog (hDlg, TRUE);
  295.             break;
  296.         default:
  297.             return 0;
  298.         }
  299.         break;
  300.     }
  301.     return 0;
  302. }
  303.  
  304. void rec::ConfigDlg (HWND parentwindow) {
  305.     prec = this;
  306.     DialogBox(dllInstance, MAKEINTRESOURCE (IDD_CONFIG), parentwindow, (DLGPROC) &ConfigDialog);
  307. }
  308.  
  309. extern "C" {
  310. __declspec(dllexport) COOERecorder * __cdecl CreateRecorder() { return new rec; }
  311. __declspec(dllexport) char * __cdecl RecInfo() { return "Next\\Sun AU Recorder"; }
  312. }
  313.  
  314. BOOL WINAPI DllMain ( HANDLE hModule, DWORD fwdreason, LPVOID lpReserved )
  315. {
  316.     switch (fwdreason) {
  317.     case DLL_PROCESS_ATTACH: { dllInstance = (HINSTANCE) hModule; } break;
  318.     case DLL_THREAD_ATTACH: break;
  319.     case DLL_THREAD_DETACH: break;
  320.     case DLL_PROCESS_DETACH: break;
  321.     }
  322.     return TRUE;
  323. }
  324.